﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Skybot.Base.Pool
{
    /// <summary>
    /// 基础数据队列
    /// 2015-7-17 修改为队列支持  ConcurrentQueue
    /// </summary>
    /// <typeparam name="T">数据类型</typeparam>
    public class BaseQueue<T>
        where T : class
    {
        /// <summary>
        /// 最大缓存队列,等待处理的数据为100万个,如果超过这个值,则开始删除以前的数据
        /// </summary>
        private int _MaxQueue = 100 * 10000;
        /// <summary>
        /// 最大队列长度,如果超过则将自动删除以前最旧的记录
        /// </summary>
        public int MaxQueue
        {
            get { return _MaxQueue; }
            set { _MaxQueue = value; }
        }

        private bool outOfMaxPrintDelInfo = true;
        /// <summary>
        /// 超过最大对像数后,是否打印删除记录日志 默认true
        /// </summary>
        public bool OutOfMaxPrintDelInfo
        {
            get { return outOfMaxPrintDelInfo; }
            set { outOfMaxPrintDelInfo = value; }
        }
        /// <summary>
        /// 当前队列包含的数据总数
        /// </summary>
        public int QueueCount { get { return poolQueue.Count; } }



        /// <summary>
        /// 将需要处理的实时数据对像添加到队列缓冲区
        /// </summary>
        /// <param name="realdata">需要处理实时数据对像</param>
        public void Push(T realdata)
        {
            lock (poolQueue)
            {
                //加入等待处理队列缓冲区
                poolQueue.Enqueue(realdata);
                //如果超过队列值,则开始删除以前的旧记录
                if (poolQueue.Count > MaxQueue)
                {
                    var temp = Pop();
                    if (OutOfMaxPrintDelInfo)
                    {
                   LogProvider.Create().Write(EventType.Warning, string.Format("数据队列已经超过最大值{0},自动删除最旧数据", MaxQueue));
                    }
                }
            }
            //
            Statistical(realdata);
            //表示可以发送数据
            //hand.Set();
        }

        //异步handler
        //private System.Threading.AutoResetEvent   hand = new System.Threading.AutoResetEvent  (false);



        #region 队列
        /// <summary>
        /// 池队列
        /// </summary>
        protected System.Collections.Concurrent.ConcurrentQueue<T> poolQueue = new System.Collections.Concurrent.ConcurrentQueue<T>();

        /// <summary>
        /// 获取一个 实时数据 对像,如果没有则返回 null
        /// </summary>
        /// <returns>如果没有则返回 null</returns>
        public T Pop()
        {
            T obj;
            //返回数据
            poolQueue.TryDequeue(out obj);

            return obj;

        }


        #endregion


        /// <summary>
        /// 用于统计的记数器,
        /// </summary>
        /// <param name="obj">实时数据对像</param>
        protected void Statistical(T obj)
        {
            ///代码没有编写

        }

    }


}
